package cn.tedu.order.tx;

import cn.tedu.order.entity.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/*
1. 接口上添加注解： @LocalTCC
2. 添加 TCC 三个方法，方法名任意，
   必须返回 boolean 表示成功或失败
3. 通过注解指定第一个 T 方法，
   通过注解的参数，指定二阶段的两个 C 方法
   @TwoPhaseBusinessAction(commitMethod="方法名",rollbackMethod="方法名")
4. 三个方法上添加参数： BusinessActionContext
   用来在两个阶段之间传递参数
5. 第一阶段方法，添加业务数据参数，用来冻结数据
6. 通过注解，把业务数据参数，放入上下文对象，向第二阶段传递
   @BusinessActionContextParameter
 */
@LocalTCC
public interface OrderTccAction {
    /*
    为了避开 seata 的一个 bug，这里不传递封装的订单对象，
    而是把数据打散，一个个单摆浮搁的传递
     */
    @TwoPhaseBusinessAction(
            name = "OrderTccAction",
            commitMethod = "commit",      //默认
            rollbackMethod = "rollback"   //默认
    )
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId")
                    Long orderId,
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);


    boolean commit(BusinessActionContext ctx);
    boolean rollback(BusinessActionContext ctx);
}
